package test;

import test.CPU.CPUPanel;
import test.panel3.CustomPanel;
import test.panel3.ProcessTableInPanel;
import test.panel4.Panel4;
import test.panel4.ResourceGUI;
import test.panel4.Scheduler;

import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import java.awt.*;

public class Main{
    // 定义字体样式


    // 进程调度算法选择，0代表默认算法
    static int algorithm = 0;
    // CPU时间片长度，默认2000毫秒
    static long cpuTime = 2000;
    // 表格数据
    static Object[][] tableDate;
    // 表头
    static String[] header = {"pid", "进程名", "优先数", "到达时间", "需要运行时间", "已用CPU时间", "进程状态"};
    // 表格模型
    static DefaultTableModel model;
    static Object[][] tableDate2;
    static String[] header2 = {"进程", "max", "allocation", "need"};
    static String[] process = new String[0];
    static int[] request;
    static String request_name;
    static String safe_sequence;



    /**
     * 主函数入口
     * @param args 命令行参数
     */
    public static void main(String[] args){
        // 1 界面组件及布局
        // 1.1 顶级容器-主容器
        JFrame frame = new JFrame("OSCourseDesign");
        frame.setSize(1000, 600);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 文本居中的单元格渲染器
        DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
        centerRenderer.setHorizontalAlignment(SwingConstants.CENTER);

        // 1.2 分页
        JTabbedPane tabbedPane = new JTabbedPane();

        // 内存分配模块
        JPanel panel3 = new JPanel(new GridBagLayout());
        JPanel panel3_1 = new JPanel();
        JPanel panel3_2 = new JPanel();
        GridBagConstraints c5 = null;
        GridBagConstraints c6 = null;

        // 设置布局约束
        // 创建GridBagConstraints对象c1，用于设置组件在GridBagLayout布局中的约束
        c5 = new GridBagConstraints();
        // 设置组件填充方式为BOTH，表示组件可以在水平和垂直方向上填充分配给它的空间
        c5.fill = GridBagConstraints.BOTH;
        // 设置组件在水平方向上的权重，权重为1.0，用于决定组件在水平方向上的扩展比例
        c5.weightx = 4.0;
        // 设置组件在垂直方向上的权重，权重为1.0，用于决定组件在垂直方向上的扩展比例
        c5.weighty = 1.0;
        // 设置panel1_1的布局为BoxLayout，沿Y轴（垂直方向）排列组件
        panel3_1.setLayout(new BoxLayout(panel3_1, BoxLayout.Y_AXIS));

        // 设置布局约束
        // 创建GridBagConstraints对象c1，用于设置组件在GridBagLayout布局中的约束
        c6 = new GridBagConstraints();
        // 设置组件填充方式为BOTH，表示组件可以在水平和垂直方向上填充分配给它的空间
        c6.fill = GridBagConstraints.BOTH;
        // 设置组件在水平方向上的权重，权重为1.0，用于决定组件在水平方向上的扩展比例
        c6.weightx = 6.0;
        // 设置组件在垂直方向上的权重，权重为1.0，用于决定组件在垂直方向上的扩展比例
        c6.weighty = 1.0;
        // 设置panel1_1的布局为BoxLayout，沿Y轴（垂直方向）排列组件
        panel3_2.setLayout(new BoxLayout(panel3_2, BoxLayout.Y_AXIS));

        // 添加组件到面板
        panel3.add(panel3_1, c5);
        panel3.add(panel3_2, c6);
        CustomPanel customPanel = CustomPanel.getInstance();
        panel3_1.add(customPanel);
        ProcessTableInPanel processTableInPanel = ProcessTableInPanel.getInstance();
        panel3_2.add(processTableInPanel.panel);

        //添加进程调度
        Panel4 panel4 = Panel4.getInstance();
        CPUPanel cpuPanel = CPUPanel.getInstance();
        Scheduler scheduler1 = Scheduler.getInstance();

        //添加资源分配
        ResourceGUI resourceGUI = ResourceGUI.getInstance();
        JPanel resouceFrame = resourceGUI.frame;

        // 添加标签页到主容器
//        tabbedPane.addTab("进程控制", panel1);
//        tabbedPane.addTab("银行家算法", panel2);
        tabbedPane.addTab("内存分配", panel3);
        tabbedPane.addTab("进程调度",panel4);
        tabbedPane.add("CPU",cpuPanel);
        tabbedPane.add("资源分配",resouceFrame);
        frame.add(tabbedPane);

        frame.setVisible(true);
    }

}
